import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

abstract class BaseWidget extends StatefulWidget {
  const BaseWidget({super.key});

  @override
  State<StatefulWidget> createState() {
    return getState();
  }

  BaseWidgetState getState();
}

abstract class BaseWidgetState<T extends BaseWidget> extends State<T> {
  /// 页面 TAG
  String TAG = "[BaseWidgetState_";

  @override
  void initState() {
    TAG = "$TAG $runtimeType]";
    super.initState();
    addNttMessageListener();
  }

  @override
  void didUpdateWidget(covariant T oldWidget) {
    super.didUpdateWidget(oldWidget);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
  }

  /// 添加监听在这里
  void addNttMessageListener() {}

  /// 页面 code
  String get pageCode;

  /// 返回首页
  void backHome() {
    Navigator.popUntil(context, (Route route) {
      return !route.navigator!.canPop();
    });
  }

  @override
  Widget build(BuildContext context) {
    ScreenUtil.init(context, designSize: const Size(1280, 720));
    return Scaffold(
      backgroundColor: getBackgroundColor(),
      body: getPageWidget(),
    );
  }

  /// 获取页面
  Widget getPageWidget();

  /// 背景颜色
  Color getBackgroundColor() {
    return Colors.white;
  }

  @override
  void dispose() {
    super.dispose();
  }

  /// 根据屏幕宽度计算像素点
  double xx(double x) {
    return sw() / 1280.0 * x;
  }

  /// 根据屏幕高度计算像素点
  double yy(double y) {
    return sh() / 720 * y;
  }

  /// 屏幕宽度
  double sw() {
    return MediaQuery.of(context).size.width;
  }

  /// 屏幕高度
  double sh() {
    return MediaQuery.of(context).size.height;
  }

  /// 适配16:10屏幕x
  double xx16(double x) {
    return get16Sw() / 1280.0 * x;
  }

  /// 适配16:10屏幕y
  double yy16(double y) {
    return get16Sh() / 720.0 * y;
  }

  double get16Sw() {
    // 获取屏幕高度
    double screenHeight = sh();
    // 计算出16:10的宽度
    double screenWidth = screenHeight / 10 * 16;
    // 如果计算出的宽度大于屏幕宽度，则根据屏幕宽度计算高度
    if (screenWidth > sw()) {
      screenWidth = sw();
      screenHeight = screenWidth / 16 * 10;
    }
    return screenWidth;
  }

  double get16Sh() {
    // 获取屏幕高度
    double screenHeight = sh();
    // 计算出16:10的宽度
    double screenWidth = screenHeight / 10 * 16;
    // 如果计算出的宽度大于屏幕宽度，则根据屏幕宽度计算高度
    if (screenWidth > sw()) {
      screenWidth = sw();
      screenHeight = screenWidth / 16 * 10;
    }
    return screenHeight;
  }

}
